/**
 * 检验页面是否有权限(自定义页面节点元素权限控制)
 *
 * @Demo:    <button v-auth="'NAV_SYS_CONFIG'">单个权限控制</button>
 *           <button v-auth="'user_add|user_edit|user_del'">多个权限控制【多个权限只要满足一个即可】</button>
 *           <button v-auth="'user_list,view'">多个权限控制【多个权限都要同时满足】</button>
 * @param auth 权限控制的标签名称，逗号(,)隔开多个值表示都要满足，竖线(|)隔开的多个值表示只要有一个满足即可
 * @param 对应值：在用双引号里面套上单引号字符串
 * @Tip   提示：建议按钮节点用单个权限控制，页面用多个权限控制
 * @Author   ZhaoXianFang
 * @DateTime 2019-09-27
 */

export default {
  // 在指令第一次绑定到元素时调用，只会调用一次。
  bind (el, binding, vnode) {
    // console.log('bind')
  },
  // 当绑定的元素插入到 DOM 时调用此函数……
  inserted: function (el, binding, vnode) {
    // console.log('inserted', binding, vnode)
    // 方式一
    // let permissionList = vnode.context.$route.meta.permission
    // let permissionList = vnode.context.$store.getters.auth_list
    // if (!permissionList.includes(binding.value)) {
    //   el.parentNode.removeChild(el)
    // }
    // 方式二
    // 获取 localStorage 的权限，是一个JSON 对象
    // var privilegeMapStr = vnode.context.$store.getters.auth_list
    // var privilegeMap = JSON.parse(privilegeMapStr)
    var privilegeMap = vnode.context.$store.getters.auth_list
    // 获取资源的唯一标识
    var privilegeKey = binding.value

    // 如果没有配置，则表示该权限不被控制
    if (privilegeKey !== undefined) {
      // key 中有多个资源，当多个资源同时有权限的时候，才能使用该权限
      if (privilegeKey.indexOf(',') >= 0) {
        var privilegeKeyArray = privilegeKey.split(',')
        // 权限值是否全部满足
        let hasPrivilegeFlag = privilegeKeyArray.every(function (item, index, array) {
          return privilegeMap.indexOf(item) !== -1
        })
        if (!hasPrivilegeFlag) {
          el.parentNode.removeChild(el)
        }
      } else if (privilegeKey.indexOf('|') >= 0) {
        // key 中有多个资源，当多个资源至少有一个有权限的时候，就能使用该权限
        let privilegeKeyArray = privilegeKey.split('|')
        // 权限值至少有一个满足
        let hasPrivilegeFlag = privilegeKeyArray.some(function (item, index, array) {
          return privilegeMap.indexOf(item) !== -1
        })
        if (!hasPrivilegeFlag) {
          el.parentNode.removeChild(el)
        }
      } else {
        // 如果没有该资源的权限，则移除节点
        if (privilegeMap.indexOf(privilegeKey) === -1) {
          if (privilegeKey === 'app_settle_list') {
            console.log('删除', privilegeKey, el.parentNode, el)
          }
          el.style.display = 'none'
          el.parentNode.removeChild(el)
        }
      }
    } else {
      // 表示权限不被控制
    }
  },
  // 在包含指令的组件的 VNode 更新后调用，但可能之前其子组件已更新。
  // 指令的值可能更新或者还没更新，然而可以通过比较绑定的当前值和旧值，来跳过不必要的更新（参考下面的钩子函数）。
  update () {
  },
  // 在指令从元素上解除绑定时调用，只会调用一次。
  unbind (el, binding) {
  }
}
